/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Monetario;

//import com.mysql.jdbc.PreparedStatement;

import com.mysql.jdbc.Connection;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.sql.PreparedStatement;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.Blob;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletContext;

/**
 *
 * @author yoju
 */
public class ManipulacionMysql {

    public int[] ingresar_cuenta(String campos,String firma,String foto,String campos2){
        //creacion de nueva cuenta llamada al store procedure
        String query = "call `ingresar_nueva_cuenta` ("+campos+",@c);";
        System.out.println(query);
        BD.GenerarSentencia(query);
        //se obtiene en numero de cuenta
        query = "SELECT @c;";
            reader = BD.GenerarR(query);
            int[] valido ={0,0};
          try {
            if (reader.next()) {
                valido[0] = reader.getInt(1);
            }
            //luego de obtener el numero de cuenta asociado al cliente
            //con este numero de cuenta obtengo el numero id_de cliente
            query = "SELECT cliente_id FROM `cuentahabiente` where cuenta_id='"+valido[0]+"'";
            System.out.print("consulta busqueda del id del cliente"+query);
            reader = BD.GenerarR(query);
            if (reader.next()) {
                valido[1] = reader.getInt(1);
           }

        reader.close();
        } catch (SQLException ex) {
            Logger.getLogger(ManipulacionMysql.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Erorr"+ex);
        }
            //Luego de esto se agregara lo que es firma y foto
            this.ingresar_foto_firma(firma, foto,campos2);
            System.out.println("valido--"+valido);
        return valido;
    }
    public void bloquear_cuenta(String campos,String declarado){
        //se hace un bloquedo de cuenta esto es con el estado =2
        String query = "update cuenta set estado_id="+declarado+" where id_cuenta='"+campos+"'";
        BD.GenerarSentencia(query);
    }
    public void declarar_cheque(String campo2,String campo1){
        String query = "update cheque set id_tipo_estado='"+campo1+"' WHERE numero='"+campo2+"'";
        System.out.println("doc-"+query);
        BD.GenerarSentencia(query);
    }
    public void crear_chequera(String campos){
        String query = "CALL set_chequera("+campos+");";
        System.out.println("doc-"+query);
        BD.GenerarSentencia(query);
    }
    public void ingresar_identificacion(String campos,String firma,String foto){
        String query = "call `docu_identificacion` ("+campos+");";
        System.out.println("doc-"+query);
        BD.GenerarSentencia(query);
        
    }
    public String BaseDatos(String tabla, String cols, String datos){
        String query = "INSERT INTO tipo_usuario values (null,'OPERADOR','realizara mantenimiento de la BD');";
        BD.GenerarSentencia(query);
        BD.EndConeccion();
        return query;
    }

    public boolean chequear_login(String alias,String password,int tipo){
            String call = "call login_usuario('" + alias + "','" + password + "','" + Integer.toString(tipo) + "',@a);";
            BD.GenerarSentencia(call);
            call = "SELECT @a;";
            reader = BD.GenerarR(call);
            int valido = 0;
          try {
            if (reader.next()) {
                valido = reader.getInt(1);
            }
        reader.close();
        } catch (SQLException ex) {
            Logger.getLogger(ManipulacionMysql.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("error chequear login "+ex);
        }
        System.out.println("validez"+String.valueOf(valido));
          if (valido > 0) {
            return true;
        } else {
            return false;
        }
        
    }
    public void insertar_cuenta(String datos_columnas){
        String query="call insertar_cuenta("+datos_columnas+");";
        BD.GenerarSentencia(query);
    }

    public String[] get_datos_clientes(String id_cliente,ServletContext context){
        //Se obtendran los datos del cliente segun el id requerido
        String[] datos_clientes={"nombre","apellido","direccion","fecha_nacimiento","firma","foto","tipo_cliente","nombre_cuenta","estado_descr","id_cuenta"};
        String query="call `get_datos`("+String.valueOf(id_cliente)+",@nombre,@apellido,@dir,@fecha,@firma,@foto,@tipo_cliente,@nombre_cuenta,@estado_descr,@idcuenta);";
        //System.out.println("llamada al store procedure --"+query);
        BD.GenerarSentencia(query);
        query="SELECT @nombre,@apellido,@dir,@fecha,@firma,@foto,@tipo_cliente,@nombre_cuenta,@estado_descr,@idcuenta;";
        //System.out.println("Seleccion de datos-------- --"+query);
            reader = BD.GenerarR(query);

          try {
            if (reader.next()) {
               datos_clientes[0] = reader.getString(1);
               datos_clientes[1] = reader.getString(2);
               datos_clientes[2] = reader.getString(3);
               datos_clientes[3] = String.valueOf(reader.getDate(4));
               InputStream imagenRecuperada = get_Imagen(reader.getBlob(5));
               datos_clientes[4]=guardaImagenEnDisco(imagenRecuperada,"firma"+String.valueOf(id_cliente),context.getRealPath("/")+"temporales");
               imagenRecuperada = get_Imagen(reader.getBlob(6));
               datos_clientes[5]=guardaImagenEnDisco(imagenRecuperada,"foto_"+String.valueOf(id_cliente),context.getRealPath("/")+"temporales");
               datos_clientes[6] = reader.getString(7);
               datos_clientes[7] = reader.getString(8);
               datos_clientes[8] = reader.getString(9);
               datos_clientes[9] = String.valueOf(reader.getInt(10));
            }
        reader.close();
        } catch (SQLException ex) {
            Logger.getLogger(ManipulacionMysql.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println(ex);
        }
        return datos_clientes;
    }
    public String[] get_ids(String inicio,String Final){
        //se procede a obtener un numero de ids de clientes
        String query="SELECT id_cliente FROM `banco`.`cliente` limit "+inicio+","+Final+";";
        System.out.println("get_id----------------"+query);
        reader = BD.GenerarR(query);
        String muestra="";

        String[] array=new String[20];
        try {
            System.out.println("totales*-------------"+reader.getFetchSize()+"---"+reader.getRow()+"---");
            while (reader.next()) {
              muestra = muestra +","+ reader.getString(1) ;
            }
            //se obtienen los ids de los clientes y se envian al quien lo solicito
            array=muestra.split(",");
            reader.close();
        } catch (SQLException ex) {
          Logger.getLogger(ManipulacionMysql.class.getName()).log(Level.SEVERE, null, ex);
        }
        return array;
    }

        public String[] get_ids_from_letter(String inicio,String Final,String letter){
        //se procede a obtener un numero de ids de clientes
        String query="SELECT id_cliente FROM `banco`.`cliente` WHERE nombres LIKE '"+letter+"%'limit "+inicio+","+Final+";";
        System.out.println("get_id----------------"+query);
        reader = BD.GenerarR(query);
        String muestra="";

        String[] array=new String[20];
        try {
            System.out.println("totales*-------------"+reader.getFetchSize()+"---"+reader.getRow()+"---");
            while (reader.next()) {
              muestra = muestra +","+ reader.getString(1) ;
            }
            //se obtienen los ids de los clientes y se envian al quien lo solicito
            array=muestra.split(",");
            reader.close();
        } catch (SQLException ex) {
          Logger.getLogger(ManipulacionMysql.class.getName()).log(Level.SEVERE, null, ex);
        }
        return array;
    }
   public String LogeoBD(String mail,String password)
    {
        String consulta="SELECT email, password,codigoactivacion" +
                " FROM Usuario where email= '"+mail+"' and password= '"+password+"'";
        reader = BD.GenerarR(consulta);

        String muestra="";
        try {
            while (reader.next()) {
              muestra = muestra + reader.getString(3) ;
            }
            reader.close();
        } catch (SQLException ex) {
          Logger.getLogger(ManipulacionMysql.class.getName()).log(Level.SEVERE, null, ex);
        }
        return muestra;
    }

   public String acivarCuenta(String mail, String password)
   {
   String consulta = "UPDATE Usuario set codigoactivacion ='activo'  WHERE email= '"+mail+"' and password= '"+password+"'";
        BD.GenerarSentencia(consulta);
        BD.EndConeccion();
        return consulta;
   }


    private void cerrar()
    {
         BD.EndConeccion();
    }
   
   private void ingresar_foto_firma(String firma,String foto,String campos){
       String query = "UPDATE CLIENTE SET firma= ?, foto=? where "+campos;
       //query="INSERT INTO cliente VALUES(null,juan,lastname,dir,'2011-10-5',1,?,null);";
        System.out.println("doc-"+query);
        try {
              File fichero = new File(firma);
              FileInputStream streamEntrada = new FileInputStream(fichero);
              File fichero2 = new File(foto);
              FileInputStream streamEntrada2 = new FileInputStream(fichero2);
              PreparedStatement pstmt = BD.connectar.prepareStatement(query);
              pstmt.setBinaryStream(1, streamEntrada, (int)fichero.length());
              pstmt.setBinaryStream(2, streamEntrada2, (int)fichero2.length());
              pstmt.executeUpdate();
              pstmt.close();
              streamEntrada.close();
              streamEntrada2.close();

        }
        catch(Exception e) {
            System.out.println("Error al escribir el Stream " + e.getMessage());
        }
    }

   //Proceso para obtener alguna imagen tipo blob del la BD
   //y guardarla en disco
   //el primer metodo recibe un inputStream q es mandado por el metodo
   //recuperar_imagen
   private String guardaImagenEnDisco(InputStream imagenBuffer,String img,String ruta)
    {


       File fichero = new File( ruta+"/"+img+".jpg");
       try // Se procede a la copia de ficheros
        {
       
            BufferedInputStream in = new BufferedInputStream(imagenBuffer);
            BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(fichero));

            byte[] bytes = new byte[8096];
            int len = 0;
            //se procede a copiar el fichero
            while ( (len = in.read( bytes ))> 0 )
            {
                out.write( bytes, 0, len );
            }

            out.flush();
            out.close();
            in.close();

        }
        catch(Exception e)
        {
            System.out.println("Error al escribir en disco " + e.getMessage());
        }
        return "temporales/"+img+".jpg";
    }

   //obtengo la imagen que se desea buscar
      private InputStream recuperaImagen(String get_campo) {
        try {
            String query = "select * from cliente limit 1";

            //se crea el statement
            java.sql.Statement stmt = BD.connectar.createStatement();
            //se ejecuta la sentencia
            ResultSet results = stmt.executeQuery(query);

            results.next();
            //obtengo el BLOB segun el campo que se desee el get_campo es el
            //nombre del campo que deseo obtener
            Blob campo = results.getBlob(get_campo);
            return campo.getBinaryStream();
        }
        catch(Exception e) {
            System.out.println("Error al recuperar el Stream");
        }

        return null;
    }
       //obtengo la imagen que se desea buscar
    private InputStream get_Imagen(Blob campo) {
        try {
            //obtengo el BLOB segun el campo que se desee el get_campo es el
            //nombre del campo que deseo obtener
            return campo.getBinaryStream();
        }
        catch(Exception e) {
            System.out.println("Error al recuperar el Stream");
        }

        return null;
    }
    public static void main(String[] args) {
             ManipulacionMysql miconx=new ManipulacionMysql();
              //InputStream imagenRecuperada = miconx.recuperaImagen("foto");
                //miconx.guardaImagenEnDisco(imagenRecuperada);
                //miconx.get_datos_clientes("1");
             //miconx.ingresar_foto_firma("E:\\Yojugracu\\Pictures\\sasukeimg.jpg","E:\\Yojugracu\\Pictures\\sasukeimg.jpg","yonatan","dartap","sdf");
    }

    ConexionMysql BD = new ConexionMysql();
    ResultSet reader=null;
}
